const express=require('express')
// 创建服务器实例对象
const app = express()
const joi = require('joi')
// 导入并配置cors中间件
const cors = require('cors')
app.use(cors())
// 配置解析表单数据的中间件
app.use(express.urlencoded({extended:false}))
// 托管静态资源
app.use('/uploads',express.static('./uploads'))
// 一定要在路由之前封装
// status默认值为1 表示失败的情况
// err的值可能是一个错误对象，也可能是一个错误的描述字符串
app.use((req,res,next)=>{
  res.cc = function (err,status=1) {
    res.send({
      status,
      message: err instanceof Error ? err.message : err    })
    }
    next()
})
// 一定要在路由之前配置解析token的中间件
const expressjwt = require('express-jwt')
const config = require('./config')
app.use(expressjwt({secret:config.jwtSecretkey}).unless({path:[/^\/api/]}))
// 导入并使用用户路由模块
const userRouter=require('./router/user')
app.use('/api',userRouter)
// 导入并使用用户信息的路由模块
const userinfoRouter = require('./router/userinfo');
app.use('/my',userinfoRouter)
// 导入并使用文章分类列表的路由模块
const artCateRouter = require('./router/artcate')
app.use('/my/article',artCateRouter)
// 导入并使用文章路由模块
const articleRouter = require('./router/article')
app.use('/my/article',articleRouter)
// 定义错误级别的中间件
app.use(((err,req,res,next)=>{
  // 验证失败导致的错误
  if(err instanceof joi.ValidationError) return res.cc(err)
  // 身份认证的错误
  if(err.name === 'UnauthorizedError') return res.cc('身份认证失败')
  // 未知错误
  res.cc(err)
}))

// 启动服务器
app.listen(3007,()=>{
  console.log('api server running at http://127.0.0.1:3007')
})